//
//  151_反转字符串中的单词.swift
//  Swift-LeetCode
//
//  Created by 卢悦明 on 2024/3/7.
/**
 给你一个字符串 s ，请你反转字符串中 单词 的顺序。
 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

 注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。

 示例 1：

 输入：s = "the sky is blue"
 输出："blue is sky the"
 
 示例 2：
 输入：s = "  hello world  "
 输出："world hello"
 解释：反转后的字符串中不能存在前导空格和尾随空格。
 
 示例 3：
 输入：s = "a good   example"
 输出："example good a"
 解释：如果两个单词间有多余的空格，反转后的字符串需要将单词间的空格减少到仅有一个。
 */

import UIKit

/**
 1、消除多余的空格
 2、翻转所有的字符串
 3、翻转每个单词
 第三季 第一个视频前半部分
 */
class StringReset: NSObject {
    
    func QA() {
        print("66|\(reverseWords("  hello world!  "))|66")
        print("66|\(reverseWords("the sky is blue"))|66")
        print("66|\(reverseWords("a good   example"))|66")

    }
    func reverseWords1(_ s: String) -> String {
        // 去空格
        var chars = s.components(separatedBy: " ")
        chars = chars.filter { $0 != "" }
//        翻转数组
        chars = chars.reversed()
        let str =  chars.joined(separator: " ")
        return str
    }
    
    /// 用字符数组实现
    /// - Parameter s: 目标数组
    /// - Returns: 结果
    func reverseWords(_ s: String) -> String {
        var chars = Array(s)
        var space = true // 前一个是否是空格
        var current = 0
        var length = 0
        var i = 0
//        去掉整个字符串中多余的空格
        while i < chars.count {
            let char = chars[i]
            if char != " " { // chars[i] 是非空格
                chars[current] = char
                current += 1
                space = false
                length += 1
            } else { //  chars[i] 是空格
                if !space { // 前一个是非空格
                    chars[current] = char
                    current += 1
                    space = true
                    length += 1
                }
            }
            i += 1
        }
        // 最后一位是空格会影响length长度
        length = space ? length - 1 : length
        if length <= 0 {
            return ""
        }
//        翻转整个字符串
        revertArray(&chars, 0, length)
//        翻转每个单词
        var prevSapace = -1
        var index = 0
        while index < length {
            if chars[index] == " " {
                revertArray(&chars, prevSapace + 1, index)
                prevSapace = index
            }
            index += 1
        }
        // 最后一个单词翻转
        revertArray(&chars, prevSapace + 1, index)

        return String(chars[0..<length])
    }
    
    /// 【li，ri）范围的字符翻转 左闭右开
    /// - Parameters:
    ///   - chars: 数组
    ///   - li: 左边
    ///   - ri: 右边边
    private func revertArray(_ chars: inout [Character], _ li: Int, _ ri: Int) {
        var li = li
        var ri = ri - 1
        while li < ri {
            (chars[li], chars[ri]) = (chars[ri], chars[li])
            li += 1
            ri -= 1
        }
    }
}
